package com.isc.homework03;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 1.编写客户端程序和服务器端程序
 * 2.客户端可以输入一个音乐文件名，比如 高山流水，服务器端接收到音乐名后，可以给客户端
 * 返回这个音乐文件，如果服务器没有这个文件，返回一个默认的音乐即可
 * 3.客户端收到文件后，保存到本地 d:\\
 * 4.提示该程序可以使用StreamUtils。java
 */
public class Server {
    public static void main(String[] args) throws IOException {
        int port = 8888;
        ServerSocket serverSocket = new ServerSocket(port);
        System.out.println("服务器在" + port + "端口监听...");
        Socket accept = serverSocket.accept();

        //获取客户端发送来的音乐文件名
        InputStream inputStream = accept.getInputStream();
        //使用处理流来处理数据
        BufferedInputStream bis = new BufferedInputStream(inputStream);
        byte[] buf = new byte[1024];
        int readLength = 0;
        StringBuilder fileName = new StringBuilder();
        while ((readLength = bis.read(buf)) != -1) {
            fileName.append(new String(buf, 0, readLength));
        }
        System.out.println("接收到的音乐文件名是:" + fileName);

        //接收到客户端发送的音乐文件名后
        //1.从本地读取音乐文件
        //使用文件流读取到文件的路径
        String filePath = "d:\\server\\" + fileName + ".avi";
        File file = new File(filePath);
        if (!file.exists()){
            //判断，如果客户端想要下载的音乐文件不存在，就下载默认的音乐文件
            //规定默认的音乐文件路径
            filePath = "d:\\server\\以父之名.avi";
            System.out.println("文件不存在，给客户端下载默认的音乐文件");
        }
        accept.getOutputStream();
        FileInputStream fis = new FileInputStream(filePath);
        //2.把读取到的文件以byte[]的形式保存需要使用ByteArrayOutputStream
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        while ((readLength = fis.read(buf)) != -1) {
            //数据写入到baos中
            baos.write(buf, 0, readLength);
        }
        //3.将baos中的数据转换成byte[]形式保存
        byte[] temp = baos.toByteArray();

        //4.将暂存数据temp发送给客户端
        OutputStream outputStream = accept.getOutputStream();
        outputStream.write(temp);
        accept.shutdownOutput();//结束符
        System.out.println("文件发送成功~");

        //关闭资源
        outputStream.close();
        baos.close();
        fis.close();
        bis.close();
        accept.close();
        serverSocket.close();
    }
}
